<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>网络核心知识总结 | ShuangChenYue</title>
    <meta name="generator" content="VuePress 1.9.10">
    <link rel="icon" href="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/logo/白云.38zbldnhh180.jpg">
    <meta name="description" content="满招损，谦受益">
    <meta name="keywords" content="专注于Cpp语言的旅行者">
    
    <link rel="preload" href="/assets/css/0.styles.952d6952.css" as="style"><link rel="preload" href="/assets/js/app.67adcfd9.js" as="script"><link rel="preload" href="/assets/js/4.9aaa1650.js" as="script"><link rel="preload" href="/assets/js/1.5474518c.js" as="script"><link rel="preload" href="/assets/js/3.593d14fc.js" as="script"><link rel="preload" href="/assets/js/73.6f8b8211.js" as="script"><link rel="prefetch" href="/assets/js/10.3242746b.js"><link rel="prefetch" href="/assets/js/100.9224de43.js"><link rel="prefetch" href="/assets/js/101.f0d1b059.js"><link rel="prefetch" href="/assets/js/102.996bfc6d.js"><link rel="prefetch" href="/assets/js/103.9bfdbd6f.js"><link rel="prefetch" href="/assets/js/104.8613f283.js"><link rel="prefetch" href="/assets/js/105.aa6e809e.js"><link rel="prefetch" href="/assets/js/106.90192392.js"><link rel="prefetch" href="/assets/js/107.e82a40b7.js"><link rel="prefetch" href="/assets/js/108.994cd438.js"><link rel="prefetch" href="/assets/js/109.ec15acc2.js"><link rel="prefetch" href="/assets/js/11.c04b41c1.js"><link rel="prefetch" href="/assets/js/110.c32d8576.js"><link rel="prefetch" href="/assets/js/111.453b5d50.js"><link rel="prefetch" href="/assets/js/112.ffbdb3a4.js"><link rel="prefetch" href="/assets/js/113.12b8ad7d.js"><link rel="prefetch" href="/assets/js/114.899d2998.js"><link rel="prefetch" href="/assets/js/115.b7ad9576.js"><link rel="prefetch" href="/assets/js/116.a8394748.js"><link rel="prefetch" href="/assets/js/117.0edfe25b.js"><link rel="prefetch" href="/assets/js/118.9161b1fe.js"><link rel="prefetch" href="/assets/js/119.be59e21b.js"><link rel="prefetch" href="/assets/js/12.41437bf6.js"><link rel="prefetch" href="/assets/js/120.bcf439fb.js"><link rel="prefetch" href="/assets/js/121.c3d251b8.js"><link rel="prefetch" href="/assets/js/122.62b1caba.js"><link rel="prefetch" href="/assets/js/123.787c2ab0.js"><link rel="prefetch" href="/assets/js/124.a880746f.js"><link rel="prefetch" href="/assets/js/125.d8edfe7b.js"><link rel="prefetch" href="/assets/js/126.4ff01546.js"><link rel="prefetch" href="/assets/js/127.9416d1ff.js"><link rel="prefetch" href="/assets/js/128.01a4a7a0.js"><link rel="prefetch" href="/assets/js/129.76876665.js"><link rel="prefetch" href="/assets/js/13.922328e9.js"><link rel="prefetch" href="/assets/js/130.7f631dd9.js"><link rel="prefetch" href="/assets/js/131.c9e0fde9.js"><link rel="prefetch" href="/assets/js/132.1c04cde5.js"><link rel="prefetch" href="/assets/js/133.e8f381cd.js"><link rel="prefetch" href="/assets/js/134.03d19f8b.js"><link rel="prefetch" href="/assets/js/135.44607494.js"><link rel="prefetch" href="/assets/js/136.6a1eb3c9.js"><link rel="prefetch" href="/assets/js/137.27898fd1.js"><link rel="prefetch" href="/assets/js/138.5bc0cf54.js"><link rel="prefetch" href="/assets/js/139.c2d1addc.js"><link rel="prefetch" href="/assets/js/14.e54d7526.js"><link rel="prefetch" href="/assets/js/140.052ec8e4.js"><link rel="prefetch" href="/assets/js/141.131abb5a.js"><link rel="prefetch" href="/assets/js/142.6ba6c07b.js"><link rel="prefetch" href="/assets/js/143.5dd51d22.js"><link rel="prefetch" href="/assets/js/144.b45afca8.js"><link rel="prefetch" href="/assets/js/145.faa9fb04.js"><link rel="prefetch" href="/assets/js/146.b54c024d.js"><link rel="prefetch" href="/assets/js/147.a1223242.js"><link rel="prefetch" href="/assets/js/148.4767bcb2.js"><link rel="prefetch" href="/assets/js/149.b65ab046.js"><link rel="prefetch" href="/assets/js/15.7082a3da.js"><link rel="prefetch" href="/assets/js/150.9bd8c175.js"><link rel="prefetch" href="/assets/js/151.9f830e96.js"><link rel="prefetch" href="/assets/js/152.41cde7f0.js"><link rel="prefetch" href="/assets/js/153.f57d65e0.js"><link rel="prefetch" href="/assets/js/154.5d7c8d51.js"><link rel="prefetch" href="/assets/js/155.0ae99532.js"><link rel="prefetch" href="/assets/js/156.5a54e043.js"><link rel="prefetch" href="/assets/js/157.c25b5d40.js"><link rel="prefetch" href="/assets/js/158.aa025b46.js"><link rel="prefetch" href="/assets/js/159.47939d88.js"><link rel="prefetch" href="/assets/js/16.fc775b7b.js"><link rel="prefetch" href="/assets/js/160.f8624459.js"><link rel="prefetch" href="/assets/js/161.7a075dc2.js"><link rel="prefetch" href="/assets/js/162.1d48f266.js"><link rel="prefetch" href="/assets/js/163.5d68a99f.js"><link rel="prefetch" href="/assets/js/164.1262d0e5.js"><link rel="prefetch" href="/assets/js/165.2ccf0bdd.js"><link rel="prefetch" href="/assets/js/166.21ece4d9.js"><link rel="prefetch" href="/assets/js/167.bf8adb95.js"><link rel="prefetch" href="/assets/js/168.1cb8440d.js"><link rel="prefetch" href="/assets/js/169.1dd1e396.js"><link rel="prefetch" href="/assets/js/17.ecc7be70.js"><link rel="prefetch" href="/assets/js/170.c29ec18f.js"><link rel="prefetch" href="/assets/js/171.38820827.js"><link rel="prefetch" href="/assets/js/172.bbc8ffc6.js"><link rel="prefetch" href="/assets/js/173.470e21e7.js"><link rel="prefetch" href="/assets/js/174.3c2df318.js"><link rel="prefetch" href="/assets/js/175.d2690cdb.js"><link rel="prefetch" href="/assets/js/176.9ca64696.js"><link rel="prefetch" href="/assets/js/177.76f3271d.js"><link rel="prefetch" href="/assets/js/178.d7d9def2.js"><link rel="prefetch" href="/assets/js/179.b5644743.js"><link rel="prefetch" href="/assets/js/18.31fe7ecd.js"><link rel="prefetch" href="/assets/js/180.7592d5ef.js"><link rel="prefetch" href="/assets/js/181.5cb77d35.js"><link rel="prefetch" href="/assets/js/182.6fa5633c.js"><link rel="prefetch" href="/assets/js/183.b3a53d1b.js"><link rel="prefetch" href="/assets/js/184.3815c537.js"><link rel="prefetch" href="/assets/js/185.bcf4ab71.js"><link rel="prefetch" href="/assets/js/186.1cc02f6d.js"><link rel="prefetch" href="/assets/js/187.8b425fb7.js"><link rel="prefetch" href="/assets/js/188.44ccbd02.js"><link rel="prefetch" href="/assets/js/189.353b35e3.js"><link rel="prefetch" href="/assets/js/19.520992d5.js"><link rel="prefetch" href="/assets/js/190.c284595f.js"><link rel="prefetch" href="/assets/js/191.788ecc2d.js"><link rel="prefetch" href="/assets/js/192.712a164e.js"><link rel="prefetch" href="/assets/js/193.da58aba3.js"><link rel="prefetch" href="/assets/js/194.6b1b1f4d.js"><link rel="prefetch" href="/assets/js/195.c31d5c39.js"><link rel="prefetch" href="/assets/js/196.f6670c4d.js"><link rel="prefetch" href="/assets/js/197.5a1f50ab.js"><link rel="prefetch" href="/assets/js/2.ab565158.js"><link rel="prefetch" href="/assets/js/20.69e29cdc.js"><link rel="prefetch" href="/assets/js/21.2fd424ad.js"><link rel="prefetch" href="/assets/js/22.d4c0be54.js"><link rel="prefetch" href="/assets/js/23.4bb90ecc.js"><link rel="prefetch" href="/assets/js/24.c01be6b2.js"><link rel="prefetch" href="/assets/js/25.c8833687.js"><link rel="prefetch" href="/assets/js/26.8042b555.js"><link rel="prefetch" href="/assets/js/27.0d5fa4c0.js"><link rel="prefetch" href="/assets/js/28.f9735b8b.js"><link rel="prefetch" href="/assets/js/29.3af53626.js"><link rel="prefetch" href="/assets/js/30.5f1b56d1.js"><link rel="prefetch" href="/assets/js/31.544b2649.js"><link rel="prefetch" href="/assets/js/32.aa321988.js"><link rel="prefetch" href="/assets/js/33.6aba2c86.js"><link rel="prefetch" href="/assets/js/34.e1bbff24.js"><link rel="prefetch" href="/assets/js/35.233f76e0.js"><link rel="prefetch" href="/assets/js/36.cb773972.js"><link rel="prefetch" href="/assets/js/37.393d9c59.js"><link rel="prefetch" href="/assets/js/38.e2d530c5.js"><link rel="prefetch" href="/assets/js/39.acaf1cc0.js"><link rel="prefetch" href="/assets/js/40.358f731e.js"><link rel="prefetch" href="/assets/js/41.ded24b7e.js"><link rel="prefetch" href="/assets/js/42.b9f683c3.js"><link rel="prefetch" href="/assets/js/43.c8fb3e66.js"><link rel="prefetch" href="/assets/js/44.633142da.js"><link rel="prefetch" href="/assets/js/45.6095e772.js"><link rel="prefetch" href="/assets/js/46.421d8c7a.js"><link rel="prefetch" href="/assets/js/47.da50fe47.js"><link rel="prefetch" href="/assets/js/48.15ff5726.js"><link rel="prefetch" href="/assets/js/49.b662e624.js"><link rel="prefetch" href="/assets/js/5.c1b8a209.js"><link rel="prefetch" href="/assets/js/50.a8bc75df.js"><link rel="prefetch" href="/assets/js/51.51e36ae7.js"><link rel="prefetch" href="/assets/js/52.54cc6e51.js"><link rel="prefetch" href="/assets/js/53.4173561d.js"><link rel="prefetch" href="/assets/js/54.7cab8416.js"><link rel="prefetch" href="/assets/js/55.3d7317d3.js"><link rel="prefetch" href="/assets/js/56.3c22255b.js"><link rel="prefetch" href="/assets/js/57.18e46e30.js"><link rel="prefetch" href="/assets/js/58.aad57f31.js"><link rel="prefetch" href="/assets/js/59.7897f6a7.js"><link rel="prefetch" href="/assets/js/6.3131f88a.js"><link rel="prefetch" href="/assets/js/60.5cd0051a.js"><link rel="prefetch" href="/assets/js/61.d9606403.js"><link rel="prefetch" href="/assets/js/62.aede9df0.js"><link rel="prefetch" href="/assets/js/63.2c30e554.js"><link rel="prefetch" href="/assets/js/64.18228ab7.js"><link rel="prefetch" href="/assets/js/65.27cb3fba.js"><link rel="prefetch" href="/assets/js/66.2fa6c2dc.js"><link rel="prefetch" href="/assets/js/67.d274a8df.js"><link rel="prefetch" href="/assets/js/68.3069cfcf.js"><link rel="prefetch" href="/assets/js/69.4c28600f.js"><link rel="prefetch" href="/assets/js/7.89e6165d.js"><link rel="prefetch" href="/assets/js/70.4175440c.js"><link rel="prefetch" href="/assets/js/71.2ee6b435.js"><link rel="prefetch" href="/assets/js/72.c75e3bb8.js"><link rel="prefetch" href="/assets/js/74.6c7720cf.js"><link rel="prefetch" href="/assets/js/75.cccfb229.js"><link rel="prefetch" href="/assets/js/76.f022e5da.js"><link rel="prefetch" href="/assets/js/77.dab46206.js"><link rel="prefetch" href="/assets/js/78.ca574b2a.js"><link rel="prefetch" href="/assets/js/79.3d75e618.js"><link rel="prefetch" href="/assets/js/80.091749b1.js"><link rel="prefetch" href="/assets/js/81.14db0e21.js"><link rel="prefetch" href="/assets/js/82.8a2b1809.js"><link rel="prefetch" href="/assets/js/83.84a4b599.js"><link rel="prefetch" href="/assets/js/84.11d7c222.js"><link rel="prefetch" href="/assets/js/85.273d4388.js"><link rel="prefetch" href="/assets/js/86.fb40e20c.js"><link rel="prefetch" href="/assets/js/87.3316639e.js"><link rel="prefetch" href="/assets/js/88.dfc52200.js"><link rel="prefetch" href="/assets/js/89.8d615f6e.js"><link rel="prefetch" href="/assets/js/90.1d9f08bb.js"><link rel="prefetch" href="/assets/js/91.566813e7.js"><link rel="prefetch" href="/assets/js/92.d13c6f41.js"><link rel="prefetch" href="/assets/js/93.845c42a0.js"><link rel="prefetch" href="/assets/js/94.20a37b77.js"><link rel="prefetch" href="/assets/js/95.1a498005.js"><link rel="prefetch" href="/assets/js/96.39fa7f4b.js"><link rel="prefetch" href="/assets/js/97.50f7170e.js"><link rel="prefetch" href="/assets/js/98.dd2e15d6.js"><link rel="prefetch" href="/assets/js/99.ef7ea06a.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.ae6b1de9.js">
    <link rel="stylesheet" href="/assets/css/0.styles.952d6952.css">
  </head>
  <body class="theme-mode-light">
    <div id="app" data-server-rendered="true"><div class="theme-container sidebar-open have-rightmenu"><header class="navbar blur"><div title="目录" class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><img src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/logo/白云.38zbldnhh180.jpg" alt="ShuangChenYue" class="logo"> <span class="site-name can-hide">ShuangChenYue</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link">首页</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="CPP语言" class="dropdown-title"><!----> <span class="title" style="display:;">CPP语言</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/c5bdd8/" class="nav-link">Cpp之旅</a></li><li class="dropdown-item"><!----> <a href="/pages/279e62/" class="nav-link">Cpp专栏</a></li><li class="dropdown-item"><!----> <a href="/pages/801755/" class="nav-link">Effective_CPP</a></li><li class="dropdown-item"><!----> <a href="/pages/6b2468/" class="nav-link">muduo网络库</a></li><li class="dropdown-item"><!----> <a href="/pages/5f8c9f/" class="nav-link">Unix环境高级编程</a></li><li class="dropdown-item"><!----> <a href="/pages/3f1d21/" class="nav-link">Cpp提高编程</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="计算机基础" class="dropdown-title"><!----> <span class="title" style="display:;">计算机基础</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/7b1cb2/" aria-current="page" class="nav-link router-link-exact-active router-link-active">计算机网络</a></li><li class="dropdown-item"><!----> <a href="/pages/6048a8/" class="nav-link">操作系统</a></li><li class="dropdown-item"><!----> <a href="/pages/3b34ba/" class="nav-link">数据结构</a></li><li class="dropdown-item"><!----> <a href="/pages/412fe7/" class="nav-link">Linux</a></li><li class="dropdown-item"><!----> <a href="/pages/2dcfa1/" class="nav-link">算法</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="数据库" class="dropdown-title"><!----> <span class="title" style="display:;">数据库</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/efa3f2/" class="nav-link">基础篇</a></li><li class="dropdown-item"><!----> <a href="/pages/ccc445/" class="nav-link">MySql</a></li><li class="dropdown-item"><!----> <a href="/pages/54616e/" class="nav-link">Redis</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="嵌入式软件开发" class="dropdown-title"><!----> <span class="title" style="display:;">嵌入式软件开发</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/d142c2/" class="nav-link">电子嵌入式通信协议</a></li><li class="dropdown-item"><!----> <a href="/pages/4c6bf3/" class="nav-link">深入浅出SSD</a></li><li class="dropdown-item"><!----> <a href="/pages/d3f36a/" class="nav-link">文件系统</a></li><li class="dropdown-item"><!----> <a href="/pages/e0cca7/" class="nav-link">汇编语言</a></li><li class="dropdown-item"><!----> <a href="/pages/fab2d7/" class="nav-link">STM32</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="开发日常" class="dropdown-title"><!----> <span class="title" style="display:;">开发日常</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/e472d1/" class="nav-link">随笔（持续更新）</a></li><li class="dropdown-item"><!----> <a href="/pages/71f6ae/" class="nav-link">Git知识总结</a></li><li class="dropdown-item"><!----> <a href="/pages/db6fb8/" class="nav-link">Git备忘清单</a></li><li class="dropdown-item"><!----> <a href="/pages/e1081f/" class="nav-link">Git 创建删除远程分支</a></li><li class="dropdown-item"><!----> <a href="/pages/777b8a/" class="nav-link">nvm使用小结</a></li><li class="dropdown-item"><!----> <a href="/pages/ee770e/" class="nav-link">虚拟机固定 IP 地址</a></li><li class="dropdown-item"><!----> <a href="/pages/1ab9a6/" class="nav-link">Shell 脚本学习笔记</a></li><li class="dropdown-item"><!----> <a href="/pages/411aa4/" class="nav-link">VScode 插件 CodeGeeX 使用教程</a></li><li class="dropdown-item"><!----> <a href="/pages/0d525d/" class="nav-link">KylinV10 将项目上传至 Github教程</a></li><li class="dropdown-item"><!----> <a href="/pages/907786/" class="nav-link">KylinV10 安装 MySQL 教程（可防踩雷）</a></li><li class="dropdown-item"><!----> <a href="/pages/a2d21e/" class="nav-link">kylinV10-SP1 安装 QT</a></li><li class="dropdown-item"><!----> <a href="/pages/b561cf/" class="nav-link">高并发内存池</a></li><li class="dropdown-item"><!----> <a href="/pages/6ab6d1/" class="nav-link">USBGUARD 项目编译环境配置</a></li><li class="dropdown-item"><!----> <a href="/pages/883f02/" class="nav-link">Power_Destory 项目</a></li><li class="dropdown-item"><!----> <a href="/pages/479472/" class="nav-link">U 盘清除工具编译教程</a></li><li class="dropdown-item"><!----> <a href="/pages/9c4241/" class="nav-link">个人博客代码推送教程</a></li><li class="dropdown-item"><!----> <a href="/pages/3ad765/" class="nav-link">SVN Trunk Branches的Merge操作</a></li><li class="dropdown-item"><!----> <a href="/pages/0c0ca8/" class="nav-link">如何高效阅读嵌入式项目代码</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端学习" class="dropdown-title"><!----> <span class="title" style="display:;">前端学习</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/99897f/" class="nav-link">HTML与CSS</a></li><li class="dropdown-item"><!----> <a href="/pages/51542d/" class="nav-link">JS学习</a></li><li class="dropdown-item"><!----> <a href="/pages/803f9d/" class="nav-link">Vue3入门</a></li><li class="dropdown-item"><!----> <a href="/pages/ca4cfb/" class="nav-link">Vue3进阶</a></li><li class="dropdown-item"><!----> <a href="/pages/50e8d3/" class="nav-link">黑马Vue3</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="MFC" class="dropdown-title"><!----> <span class="title" style="display:;">MFC</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/a4b108/" class="nav-link">MFC编程随记</a></li><li class="dropdown-item"><!----> <a href="/pages/41acbd/" class="nav-link">MFC实现ini配置文件的读取</a></li><li class="dropdown-item"><!----> <a href="/pages/951a7a/" class="nav-link">MFC实现点击列表头排序</a></li><li class="dropdown-item"><!----> <a href="/pages/a8598f/" class="nav-link">贴图法美化Button按钮</a></li><li class="dropdown-item"><!----> <a href="/pages/054516/" class="nav-link">MFC使用细节</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="闪存" class="dropdown-title"><!----> <span class="title" style="display:;">闪存</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/b925b8/" class="nav-link">如何高效阅读嵌入式项目代码</a></li><li class="dropdown-item"><!----> <a href="/pages/28ec23/" class="nav-link">NAND Flash</a></li><li class="dropdown-item"><!----> <a href="/pages/62bf40/" class="nav-link">ARM 处理器</a></li><li class="dropdown-item"><!----> <a href="/pages/1a9374/" class="nav-link">嵌入式基础知识-存储器</a></li><li class="dropdown-item"><!----> <a href="/pages/aac5e3/" class="nav-link">闪存存储和制造技术概述</a></li><li class="dropdown-item"><!----> <a href="/pages/8f6056/" class="nav-link">芯片IO驱动力</a></li><li class="dropdown-item"><!----> <a href="/pages/d146b8/" class="nav-link">主流先进封装技术介绍</a></li><li class="dropdown-item"><!----> <a href="/pages/16f0ba/" class="nav-link">NAND Flash基础</a></li><li class="dropdown-item"><!----> <a href="/pages/90d8d0/" class="nav-link">基于PA算法的FTL引导</a></li><li class="dropdown-item"><!----> <a href="/pages/eb672b/" class="nav-link">SD逻辑擦除和物理擦除</a></li><li class="dropdown-item"><!----> <a href="/pages/747121/" class="nav-link">NAND Flash的SDR、ONFI、DDR接口</a></li><li class="dropdown-item"><!----> <a href="/pages/1eb351/" class="nav-link">【详解】Nand Flash必看知识</a></li><li class="dropdown-item"><!----> <a href="/pages/d2512a/" class="nav-link">【两万字详解】Nand Flash必看知识</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="面经" class="dropdown-title"><!----> <span class="title" style="display:;">面经</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/d69946/" class="nav-link">虎牙C++技术面经</a></li><li class="dropdown-item"><!----> <a href="/pages/29251d/" class="nav-link">金山一面复习</a></li><li class="dropdown-item"><!----> <a href="/pages/c7c01f/" class="nav-link">完美世界秋招 C++ 游戏开发面经(Cpp部分)</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="其它" class="dropdown-title"><!----> <span class="title" style="display:;">其它</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/fa256e/" class="nav-link">博客搭建</a></li><li class="dropdown-item"><!----> <a href="/pages/335531/" class="nav-link">网站收藏箱</a></li></ul></div></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <div class="sidebar-hover-trigger"></div> <aside class="sidebar" style="display:none;"><!----> <nav class="nav-links"><div class="nav-item"><a href="/" class="nav-link">首页</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="CPP语言" class="dropdown-title"><!----> <span class="title" style="display:;">CPP语言</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/c5bdd8/" class="nav-link">Cpp之旅</a></li><li class="dropdown-item"><!----> <a href="/pages/279e62/" class="nav-link">Cpp专栏</a></li><li class="dropdown-item"><!----> <a href="/pages/801755/" class="nav-link">Effective_CPP</a></li><li class="dropdown-item"><!----> <a href="/pages/6b2468/" class="nav-link">muduo网络库</a></li><li class="dropdown-item"><!----> <a href="/pages/5f8c9f/" class="nav-link">Unix环境高级编程</a></li><li class="dropdown-item"><!----> <a href="/pages/3f1d21/" class="nav-link">Cpp提高编程</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="计算机基础" class="dropdown-title"><!----> <span class="title" style="display:;">计算机基础</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/7b1cb2/" aria-current="page" class="nav-link router-link-exact-active router-link-active">计算机网络</a></li><li class="dropdown-item"><!----> <a href="/pages/6048a8/" class="nav-link">操作系统</a></li><li class="dropdown-item"><!----> <a href="/pages/3b34ba/" class="nav-link">数据结构</a></li><li class="dropdown-item"><!----> <a href="/pages/412fe7/" class="nav-link">Linux</a></li><li class="dropdown-item"><!----> <a href="/pages/2dcfa1/" class="nav-link">算法</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="数据库" class="dropdown-title"><!----> <span class="title" style="display:;">数据库</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/efa3f2/" class="nav-link">基础篇</a></li><li class="dropdown-item"><!----> <a href="/pages/ccc445/" class="nav-link">MySql</a></li><li class="dropdown-item"><!----> <a href="/pages/54616e/" class="nav-link">Redis</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="嵌入式软件开发" class="dropdown-title"><!----> <span class="title" style="display:;">嵌入式软件开发</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/d142c2/" class="nav-link">电子嵌入式通信协议</a></li><li class="dropdown-item"><!----> <a href="/pages/4c6bf3/" class="nav-link">深入浅出SSD</a></li><li class="dropdown-item"><!----> <a href="/pages/d3f36a/" class="nav-link">文件系统</a></li><li class="dropdown-item"><!----> <a href="/pages/e0cca7/" class="nav-link">汇编语言</a></li><li class="dropdown-item"><!----> <a href="/pages/fab2d7/" class="nav-link">STM32</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="开发日常" class="dropdown-title"><!----> <span class="title" style="display:;">开发日常</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/e472d1/" class="nav-link">随笔（持续更新）</a></li><li class="dropdown-item"><!----> <a href="/pages/71f6ae/" class="nav-link">Git知识总结</a></li><li class="dropdown-item"><!----> <a href="/pages/db6fb8/" class="nav-link">Git备忘清单</a></li><li class="dropdown-item"><!----> <a href="/pages/e1081f/" class="nav-link">Git 创建删除远程分支</a></li><li class="dropdown-item"><!----> <a href="/pages/777b8a/" class="nav-link">nvm使用小结</a></li><li class="dropdown-item"><!----> <a href="/pages/ee770e/" class="nav-link">虚拟机固定 IP 地址</a></li><li class="dropdown-item"><!----> <a href="/pages/1ab9a6/" class="nav-link">Shell 脚本学习笔记</a></li><li class="dropdown-item"><!----> <a href="/pages/411aa4/" class="nav-link">VScode 插件 CodeGeeX 使用教程</a></li><li class="dropdown-item"><!----> <a href="/pages/0d525d/" class="nav-link">KylinV10 将项目上传至 Github教程</a></li><li class="dropdown-item"><!----> <a href="/pages/907786/" class="nav-link">KylinV10 安装 MySQL 教程（可防踩雷）</a></li><li class="dropdown-item"><!----> <a href="/pages/a2d21e/" class="nav-link">kylinV10-SP1 安装 QT</a></li><li class="dropdown-item"><!----> <a href="/pages/b561cf/" class="nav-link">高并发内存池</a></li><li class="dropdown-item"><!----> <a href="/pages/6ab6d1/" class="nav-link">USBGUARD 项目编译环境配置</a></li><li class="dropdown-item"><!----> <a href="/pages/883f02/" class="nav-link">Power_Destory 项目</a></li><li class="dropdown-item"><!----> <a href="/pages/479472/" class="nav-link">U 盘清除工具编译教程</a></li><li class="dropdown-item"><!----> <a href="/pages/9c4241/" class="nav-link">个人博客代码推送教程</a></li><li class="dropdown-item"><!----> <a href="/pages/3ad765/" class="nav-link">SVN Trunk Branches的Merge操作</a></li><li class="dropdown-item"><!----> <a href="/pages/0c0ca8/" class="nav-link">如何高效阅读嵌入式项目代码</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端学习" class="dropdown-title"><!----> <span class="title" style="display:;">前端学习</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/99897f/" class="nav-link">HTML与CSS</a></li><li class="dropdown-item"><!----> <a href="/pages/51542d/" class="nav-link">JS学习</a></li><li class="dropdown-item"><!----> <a href="/pages/803f9d/" class="nav-link">Vue3入门</a></li><li class="dropdown-item"><!----> <a href="/pages/ca4cfb/" class="nav-link">Vue3进阶</a></li><li class="dropdown-item"><!----> <a href="/pages/50e8d3/" class="nav-link">黑马Vue3</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="MFC" class="dropdown-title"><!----> <span class="title" style="display:;">MFC</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/a4b108/" class="nav-link">MFC编程随记</a></li><li class="dropdown-item"><!----> <a href="/pages/41acbd/" class="nav-link">MFC实现ini配置文件的读取</a></li><li class="dropdown-item"><!----> <a href="/pages/951a7a/" class="nav-link">MFC实现点击列表头排序</a></li><li class="dropdown-item"><!----> <a href="/pages/a8598f/" class="nav-link">贴图法美化Button按钮</a></li><li class="dropdown-item"><!----> <a href="/pages/054516/" class="nav-link">MFC使用细节</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="闪存" class="dropdown-title"><!----> <span class="title" style="display:;">闪存</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/b925b8/" class="nav-link">如何高效阅读嵌入式项目代码</a></li><li class="dropdown-item"><!----> <a href="/pages/28ec23/" class="nav-link">NAND Flash</a></li><li class="dropdown-item"><!----> <a href="/pages/62bf40/" class="nav-link">ARM 处理器</a></li><li class="dropdown-item"><!----> <a href="/pages/1a9374/" class="nav-link">嵌入式基础知识-存储器</a></li><li class="dropdown-item"><!----> <a href="/pages/aac5e3/" class="nav-link">闪存存储和制造技术概述</a></li><li class="dropdown-item"><!----> <a href="/pages/8f6056/" class="nav-link">芯片IO驱动力</a></li><li class="dropdown-item"><!----> <a href="/pages/d146b8/" class="nav-link">主流先进封装技术介绍</a></li><li class="dropdown-item"><!----> <a href="/pages/16f0ba/" class="nav-link">NAND Flash基础</a></li><li class="dropdown-item"><!----> <a href="/pages/90d8d0/" class="nav-link">基于PA算法的FTL引导</a></li><li class="dropdown-item"><!----> <a href="/pages/eb672b/" class="nav-link">SD逻辑擦除和物理擦除</a></li><li class="dropdown-item"><!----> <a href="/pages/747121/" class="nav-link">NAND Flash的SDR、ONFI、DDR接口</a></li><li class="dropdown-item"><!----> <a href="/pages/1eb351/" class="nav-link">【详解】Nand Flash必看知识</a></li><li class="dropdown-item"><!----> <a href="/pages/d2512a/" class="nav-link">【两万字详解】Nand Flash必看知识</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="面经" class="dropdown-title"><!----> <span class="title" style="display:;">面经</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/d69946/" class="nav-link">虎牙C++技术面经</a></li><li class="dropdown-item"><!----> <a href="/pages/29251d/" class="nav-link">金山一面复习</a></li><li class="dropdown-item"><!----> <a href="/pages/c7c01f/" class="nav-link">完美世界秋招 C++ 游戏开发面经(Cpp部分)</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="其它" class="dropdown-title"><!----> <span class="title" style="display:;">其它</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/pages/fa256e/" class="nav-link">博客搭建</a></li><li class="dropdown-item"><!----> <a href="/pages/335531/" class="nav-link">网站收藏箱</a></li></ul></div></div> <!----></nav>  <ul class="sidebar-links"><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>网络</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/pages/7b1cb2/" aria-current="page" class="active sidebar-link">网络核心知识总结</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level2"><a href="/pages/7b1cb2/#基础" class="sidebar-link">基础</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#网络分层模型" class="sidebar-link">网络分层模型</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#osi-七层模型是什么-每一层的作用是什么" class="sidebar-link">OSI 七层模型是什么？每一层的作用是什么？</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#tcp-ip-四层模型是什么-每一层的作用是什么" class="sidebar-link">TCP/IP 四层模型是什么？每一层的作用是什么？</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#为什么网络要分层" class="sidebar-link">为什么网络要分层？</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#各层的封装格式是怎么样的" class="sidebar-link">各层的封装格式是怎么样的？</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#常见网络协议" class="sidebar-link">常见网络协议</a></li><li class="sidebar-sub-header level5"><a href="/pages/7b1cb2/#应用层有哪些常见的协议" class="sidebar-link">应用层有哪些常见的协议？</a></li><li class="sidebar-sub-header level5"><a href="/pages/7b1cb2/#传输层有哪些常见的协议" class="sidebar-link">传输层有哪些常见的协议？</a></li><li class="sidebar-sub-header level5"><a href="/pages/7b1cb2/#网络层有哪些常见的协议" class="sidebar-link">网络层有哪些常见的协议？</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/7b1cb2/#http-应用层" class="sidebar-link">HTTP（应用层）</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#从输入-url-到页面展示到底发生了什么-重要" class="sidebar-link">从输入 URL 到页面展示到底发生了什么？（重要）</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#http-状态码有哪些" class="sidebar-link">HTTP 状态码有哪些？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#http-header-中常见的字段有哪些" class="sidebar-link">HTTP Header 中常见的字段有哪些？</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#_1、host-字段" class="sidebar-link">1、Host 字段</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#_2、content-length-字段" class="sidebar-link">2、Content-Length 字段</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#_3、connection-字段" class="sidebar-link">3、Connection 字段</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#_4、content-type-字段" class="sidebar-link">4、Content-Type 字段</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#_5、content-encoding-字段" class="sidebar-link">5、Content-Encoding 字段</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#其他字段" class="sidebar-link">其他字段</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#http-和-https-有什么区别-重要-4" class="sidebar-link">HTTP 和 HTTPS 有什么区别？（重要）4</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#http-1-0-和-http-1-1-有什么区别-5" class="sidebar-link">HTTP/1.0 和 HTTP/1.1 有什么区别？5</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#http-1-1-和-http-2-0-有什么区别-4" class="sidebar-link">HTTP/1.1 和 HTTP/2.0 有什么区别？4</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#http-2-0-和-http-3-0-有什么区别-5" class="sidebar-link">HTTP/2.0 和 HTTP/3.0 有什么区别？5</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#总结" class="sidebar-link">总结</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#http-是不保存状态的协议-如何保存用户状态" class="sidebar-link">HTTP 是不保存状态的协议, 如何保存用户状态？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#uri-和-url-的区别是什么" class="sidebar-link">URI 和 URL 的区别是什么?</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#cookie-和-session-有什么区别" class="sidebar-link">Cookie 和 Session 有什么区别？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#get-与-post" class="sidebar-link">GET 与 POST</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#get-和-post-有什么区别" class="sidebar-link">GET 和 POST 有什么区别？</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#get-和-post-方法都是安全和幂等的吗" class="sidebar-link">GET 和 POST 方法都是安全和幂等的吗？</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#get-一定比-post-安全吗" class="sidebar-link">GET 一定比 POST 安全吗？</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#get-请求可以带-body-吗" class="sidebar-link">GET 请求可以带 body 吗？</a></li><li class="sidebar-sub-header level4"><a href="/pages/7b1cb2/#什么是-rfc-协议" class="sidebar-link">什么是 RFC 协议？</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/7b1cb2/#tcp-与-udp-传输层" class="sidebar-link">TCP 与 UDP（传输层）</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#tcp-与-udp-的区别-重要" class="sidebar-link">TCP 与 UDP 的区别（重要）</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#什么时候选择-tcp-什么时候选-udp" class="sidebar-link">什么时候选择 TCP，什么时候选 UDP?</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#http-基于-tcp-还是-udp" class="sidebar-link">HTTP 基于 TCP 还是 UDP？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#使用-tcp-的协议有哪些" class="sidebar-link">使用 TCP 的协议有哪些?</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#使用-udp-的协议有哪些" class="sidebar-link">使用 UDP 的协议有哪些?</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/7b1cb2/#ip-网络层" class="sidebar-link">IP（网络层）</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#ip-协议的作用是什么" class="sidebar-link">IP 协议的作⽤是什么？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#什么是-ip-地址" class="sidebar-link">什么是 IP 地址？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#ip-寻址如何工作" class="sidebar-link">IP 寻址如何⼯作？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#ipv4-和-ipv6-有什么区别" class="sidebar-link">IPv4 和 IPv6 有什么区别？</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/7b1cb2/#ping" class="sidebar-link">PING</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#ping-命令的作用是什么" class="sidebar-link">ping 命令的作用是什么？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#ping-命令的工作原理是什么" class="sidebar-link">PING 命令的工作原理是什么？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#什么是-icmp-协议" class="sidebar-link">什么是 ICMP 协议？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#ping-命令的输出结果什么样子的" class="sidebar-link">ping 命令的输出结果什么样子的？</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/7b1cb2/#dns" class="sidebar-link">DNS</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#什么是-dns" class="sidebar-link">什么是 DNS？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#dns-的作用是什么" class="sidebar-link">DNS 的作用是什么？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#dns-服务器有哪些" class="sidebar-link">DNS 服务器有哪些？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#dns-解析的过程是什么样的" class="sidebar-link">DNS 解析的过程是什么样的？</a></li></ul></li><li class="sidebar-sub-header level2"><a href="/pages/7b1cb2/#arp" class="sidebar-link">ARP</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#什么是-mac-地址" class="sidebar-link">什么是 Mac 地址？</a></li><li class="sidebar-sub-header level3"><a href="/pages/7b1cb2/#arp-协议解决了什么问题" class="sidebar-link">ARP 协议解决了什么问题？</a></li></ul></li></ul></li><li><a href="/pages/0728af/" class="sidebar-link">TCP 三次握手和四次挥手</a></li><li><a href="/pages/8d5654/" class="sidebar-link">TCP 传输可靠性问题</a></li><li><a href="/pages/11e44b/" class="sidebar-link">常见状态码总结</a></li><li><a href="/pages/92d82c/" class="sidebar-link">《计算机网络》谢希仁</a></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>操作系统</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>数据结构</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>算法</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Linux</span> <span class="arrow right"></span></p> <!----></section></li></ul> </aside> <div><main class="page"><div class="theme-vdoing-wrapper "><div class="articleInfo-wrap" data-v-06225672><div class="articleInfo" data-v-06225672><ul class="breadcrumbs" data-v-06225672><li data-v-06225672><a href="/" title="首页" class="iconfont icon-home router-link-active" data-v-06225672></a></li> <li data-v-06225672><span data-v-06225672>计算机基础</span></li><li data-v-06225672><span data-v-06225672>网络</span></li></ul> <div class="info" data-v-06225672><div title="作者" class="author iconfont icon-touxiang" data-v-06225672><a href="javascript:;" data-v-06225672>霜晨月</a></div> <div title="创建时间" class="date iconfont icon-riqi" data-v-06225672><a href="javascript:;" data-v-06225672>2023-06-09</a></div> <!----></div></div></div> <!----> <div class="content-wrapper"><div class="right-menu-wrapper"><div class="right-menu-margin"><div class="right-menu-title">目录</div> <div class="right-menu-content"></div></div></div> <h1><img src="">网络核心知识总结<!----></h1> <!----> <div class="theme-vdoing-content content__default"><h1 id="计算机网络总结"><a href="#计算机网络总结" class="header-anchor">#</a> 计算机网络总结</h1> <h2 id="基础"><a href="#基础" class="header-anchor">#</a> 基础</h2> <h3 id="网络分层模型"><a href="#网络分层模型" class="header-anchor">#</a> 网络分层模型</h3> <h4 id="osi-七层模型是什么-每一层的作用是什么"><a href="#osi-七层模型是什么-每一层的作用是什么" class="header-anchor">#</a> OSI 七层模型是什么？每一层的作用是什么？</h4> <p>OSI 体系结构是<strong>法律</strong>上的国家标准，从上往下讲分别是：</p> <ol><li>应用层 -- 作用是 -- 为计算机用户提供服务</li> <li>表示层 -- 作用是 -- 数据处理(编解码、加密解密、压缩解压缩)</li> <li>会话层 -- 作用是 -- 管理 (建立、维护、重连) 应用程序之间的会话</li> <li>传输层 -- 作用是 -- 为两台主机进程之间的通信提供通用的数据传输服务</li> <li>网络层 -- 作用是 -- 路由和寻址(决定数据在网络的游走路径)</li> <li>数据链路层 -- 作用是 -- 帧编码和误差纠正控制</li> <li>物理层 -- 作用是 -- 透明地传送比特流传输</li></ol> <p><img alt="image" data-src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/network/image.8mdi6rjma8k.webp" loading="lazy" class="lazy"></p> <blockquote><p><strong>OSI 的七层体系结构概念清楚，理论也很完整，但是它比较复杂而且不实用，而且有些功能在多个层中重复出现。</strong></p></blockquote> <h4 id="tcp-ip-四层模型是什么-每一层的作用是什么"><a href="#tcp-ip-四层模型是什么-每一层的作用是什么" class="header-anchor">#</a> TCP/IP 四层模型是什么？每一层的作用是什么？</h4> <p><strong>TCP/IP 四层模型</strong> 是目前被广泛采用的一种模型,我们可以将 TCP / IP 模型看作是 OSI 七层模型的精简版本，是<strong>事实</strong>上的国家标准。</p> <p>它们分别是：</p> <ol><li>应用层 -- 整合了 [应用层、表示层、会话层]</li> <li>传输层</li> <li>网络层</li> <li>网络接口层 -- 整合了 [数据链路层、物理层]</li></ol> <p><img alt="image" data-src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/network/image.6er4ni3w9h40.webp" loading="lazy" class="lazy"></p> <p><em><strong>作用</strong></em></p> <p>应用层 -- 主要作用是 -- 解决通过应用进程的交互来实现特定网络应用的问题</p> <p>传输层 -- 主要作用是 -- 解决进程之间基于网络的通信问题</p> <p>网络层 -- 主要作用是 -- 解决分组在多个网络上传输 (路由) 的问题</p> <p>网络接口层 -- 主要作用是 -- 解决分组在一个网络 (或一段链路) 上传输以及使用何种信号来传输比特的问题</p> <h4 id="为什么网络要分层"><a href="#为什么网络要分层" class="header-anchor">#</a> 为什么网络要分层？</h4> <p>计算机网络体系结构之所以要分层，主要是为了<strong>实现模块化</strong>和<strong>分工合作</strong>的设计思想，将整个网络系统分解为若干个相对独立的层次，每层都有自己的功能和责任，<strong>便于设计、实现和维护网络系统</strong>。同时，分层还可以<strong>提高网络的灵活性和可扩展性</strong>，使得网络系统更易于适应不同的应用需求和技术变革。</p> <h4 id="各层的封装格式是怎么样的"><a href="#各层的封装格式是怎么样的" class="header-anchor">#</a> 各层的封装格式是怎么样的？</h4> <p><img alt="image" data-src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/network/image.4cfkenf7dz20.webp" loading="lazy" class="lazy"></p> <ol><li><strong>网络接口层</strong>的传输单位是帧（frame），更底下的是 比特流</li> <li>IP <strong>网络层</strong>的传输单位是包（packet）</li> <li>TCP <strong>传输层</strong>的传输单位是段（segment）</li> <li>HTTP <strong>应用层</strong>的传输单位则是消息或报文（message）。</li></ol> <p>但这些名词并没有什么本质的区分，可以统称为数据包。</p> <h4 id="常见网络协议"><a href="#常见网络协议" class="header-anchor">#</a> 常见网络协议</h4> <h5 id="应用层有哪些常见的协议"><a href="#应用层有哪些常见的协议" class="header-anchor">#</a> 应用层有哪些常见的协议？</h5> <p>9 个：HTTP、SMTP、POP3、IMAP、FTP、Telnet、SSH、RTP、DNS</p> <p>概览如下图：</p> <p><img alt="image" data-src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/network/image.4n590h0736w0.webp" loading="lazy" class="lazy"></p> <ul><li><strong>HTTP（Hypertext Transfer Protocol，超文本传输协议）</strong>：基于 TCP 协议，是一种用于传输超文本和多媒体内容的协议，主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候，我们网页就是通过 HTTP 请求进行加载的。</li> <li><strong>SMTP（Simple Mail Transfer Protocol，简单邮件发送协议）</strong>：基于 TCP 协议，是一种用于发送电子邮件的协议。注意 ⚠️：SMTP 协议只负责邮件的发送，而不是接收。要从邮件服务器接收邮件，需要使用 POP3 或 IMAP 协议。</li> <li><strong>POP3/IMAP（邮件接收协议）</strong>：基于 TCP 协议，两者都是负责邮件接收的协议。IMAP 协议是比 POP3 更新的协议，它在功能和性能上都更加强大。IMAP 支持邮件搜索、标记、分类、归档等高级功能，而且可以在多个设备之间同步邮件状态。几乎所有现代电子邮件客户端和服务器都支持 IMAP。</li> <li><strong>FTP（File Transfer Protocol，文件传输协议）</strong> : 基于 TCP 协议，是一种用于在计算机之间传输文件的协议，可以屏蔽操作系统和文件存储方式。注意 ⚠️：FTP 是一种不安全的协议，因为它在传输过程中不会对数据进行加密。建议在传输敏感数据时使用更安全的协议，如 SFTP。</li> <li><strong>Telnet（远程登陆协议）</strong>：基于 TCP 协议，用于通过一个终端登陆到其他服务器。Telnet 协议的最大缺点之一是所有数据（包括用户名和密码）均以明文形式发送，这有潜在的安全风险。这就是为什么如今很少使用 Telnet，而是使用一种称为 SSH 的非常安全的网络传输协议的主要原因。</li> <li><strong>SSH（Secure Shell Protocol，安全的网络传输协议）</strong>：基于 TCP 协议，通过加密和认证机制实现安全的访问和文件传输等业务</li> <li><strong>RTP（Real-time Transport Protocol，实时传输协议）</strong>：通常基于 UDP 协议，但也支持 TCP 协议。它提供了端到端的实时传输数据的功能，但不包含资源预留存、不保证实时传输质量，这些功能由 WebRTC 实现。</li> <li><strong>DNS（Domain Name System，域名管理系统）</strong>: 基于 UDP 协议，用于解决域名和 IP 地址的映射问题。</li></ul> <h5 id="传输层有哪些常见的协议"><a href="#传输层有哪些常见的协议" class="header-anchor">#</a> 传输层有哪些常见的协议？</h5> <p>传输控制协议 TCP 和 用户数据协议 UDP</p> <ul><li><strong>TCP（Transmission Control Protocol，传输控制协议 ）</strong>：提供 <strong>面向连接</strong> 的，<strong>可靠</strong> 的数据传输服务。</li> <li><strong>UDP（User Datagram Protocol，用户数据协议）</strong>：提供 <strong>无连接</strong> 的，<strong>尽最大努力</strong> 的数据传输服务（不保证数据传输的可靠性），简单高效。</li></ul> <h5 id="网络层有哪些常见的协议"><a href="#网络层有哪些常见的协议" class="header-anchor">#</a> 网络层有哪些常见的协议？</h5> <p>7 个：IP、ARP、ICMP、NAT、OSPF、RIP、BGP</p> <ul><li><strong>IP（Internet Protocol，网际协议）</strong>：TCP/IP 协议中最重要的协议之一，属于网络层的协议，主要作用是定义数据包的格式、对数据包进行路由和寻址，以便它们可以跨网络传播并到达正确的目的地。目前 IP 协议主要分为两种，一种是过去的 IPv4，另一种是较新的 IPv6，目前这两种协议都在使用，但后者已经被提议来取代前者。</li> <li><strong>ARP（Address Resolution Protocol，地址解析协议）</strong>：ARP 协议解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中，总是需要知道下一跳（物理上的下一个目的地）该去往何处，但 IP 地址属于逻辑地址，而 MAC 地址才是物理地址，ARP 协议解决了 IP 地址转 MAC 地址的一些问题。</li> <li><strong>ICMP（Internet Control Message Protocol，互联网控制报文协议）</strong>：一种用于传输网络状态和错误消息的协议，常用于网络诊断和故障排除。例如，Ping 工具就使用了 ICMP 协议来测试网络连通性。</li> <li><strong>NAT（Network Address Translation，网络地址转换协议）</strong>：NAT 协议的应用场景如同它的名称——网络地址转换，应用于内部网到外部网的地址转换过程中。具体地说，在一个小的子网（局域网，LAN）内，各主机使用的是同一个 LAN 下的 IP 地址，但在该 LAN 以外，在广域网（WAN）中，需要一个统一的 IP 地址来标识该 LAN 在整个 Internet 上的位置。</li> <li><strong>OSPF（Open Shortest Path First，开放式最短路径优先）</strong>：一种内部网关协议（Interior Gateway Protocol，IGP），也是广泛使用的一种动态路由协议，基于链路状态算法，考虑了链路的带宽、延迟等因素来选择最佳路径。</li> <li><strong>RIP(Routing Information Protocol，路由信息协议）</strong>：一种内部网关协议（Interior Gateway Protocol，IGP），也是一种动态路由协议，基于距离向量算法，使用固定的跳数作为度量标准，选择跳数最少的路径作为最佳路径。</li> <li><strong>BGP（Border Gateway Protocol，边界网关协议）</strong>：一种用来在路由选择域之间交换网络层可达性信息（Network Layer Reachability Information，NLRI）的路由选择协议，具有高度的灵活性和可扩展性。</li></ul> <h2 id="http-应用层"><a href="#http-应用层" class="header-anchor">#</a> HTTP（应用层）</h2> <h3 id="从输入-url-到页面展示到底发生了什么-重要"><a href="#从输入-url-到页面展示到底发生了什么-重要" class="header-anchor">#</a> 从输入 URL 到页面展示到底发生了什么？（重要）</h3> <p>总体来说分为以下几个过程:</p> <ol><li>DNS 解析 -- 浏览器查找域名的 IP 地址(DNS查找过程: 浏览器缓存、路由器缓存、DNS 缓存)</li> <li>与服务器建立 TCP 连接</li> <li>浏览器向 web 服务器发送一个 HTTP 请求(cookies会随着请求发送给服务器)</li> <li>服务器处理请求并返回 HTTP 报文(请求 处理请求 &amp; 它的参数、cookies、生成一个 HTML 响应)</li> <li>浏览器解析渲染页面 -- 也就是浏览器开始显示 HTML</li> <li>连接结束</li></ol> <p>期间使用到的<strong>协议</strong>：</p> <ol><li>DNS: 获取域名对应 IP</li> <li>TCP: 与服务器建立 TCP 连接</li> <li>IP: 建立 TCP 协议时，需要发送数据，发送数据在网络层使用 IP 协议</li> <li>OSPF: IP 数据包在路由器之间，路由选择使用 OPSF 协议</li> <li>ARP: 路由器在与服务器通信时，需要将 ip 地址转换为 MAC 地址，需要使用 ARP 协议</li> <li>HTTP: 在 TCP 建立完成后，使用 HTTP 协议访问网页</li></ol> <blockquote><p>思考：ip 地址与 MAC 地址的区别？</p></blockquote> <h3 id="http-状态码有哪些"><a href="#http-状态码有哪些" class="header-anchor">#</a> HTTP 状态码有哪些？</h3> <p>HTTP 状态码主要有五大类，用于描述 HTTP 请求的结果。</p> <p>比如：</p> <table><thead><tr><th></th> <th>类别</th> <th>具体含义</th> <th>常见状态码</th></tr></thead> <tbody><tr><td>1xx</td> <td>Informational(信息性状态码)</td> <td>提示信息，接收的请求正在处理，表示目前是协议处理的中间状态，还需要后续的操作</td> <td></td></tr> <tr><td>2xx</td> <td>Success (成功状态码)</td> <td>成功，请求正常处理完毕</td> <td>200、204、206</td></tr> <tr><td>3xx</td> <td>Redirection (重定向状态码)</td> <td>重定向，资源位置发生变动，需要客户端重新发送请求</td> <td>301、302、304</td></tr> <tr><td>4xx</td> <td>Client Error (客户端错误状态码)</td> <td>客户端错误，请求报文有误，服务器无法处理请求</td> <td>400、403、404</td></tr> <tr><td>5xx</td> <td>Server Error (服务器错误状态码)</td> <td>服务器错误，服务器在处理请求时内部发生了错误</td> <td>500、501、502、503</td></tr></tbody></table> <blockquote><p>思考：每个常见状态码的含义？</p></blockquote> <h3 id="http-header-中常见的字段有哪些"><a href="#http-header-中常见的字段有哪些" class="header-anchor">#</a> HTTP Header 中常见的字段有哪些？</h3> <h4 id="_1、host-字段"><a href="#_1、host-字段" class="header-anchor">#</a> <em>1、Host 字段</em></h4> <p>客户端发送请求时，用来指定<strong>服务器的域名</strong>。</p> <p>有了 <code>Host</code> 字段，就可以将请求发往「同一台」服务器上的不同网站。</p> <p>示例</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>Host: www.A.com

Host: en.wikipedia.org:80
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h4 id="_2、content-length-字段"><a href="#_2、content-length-字段" class="header-anchor">#</a> <em>2、Content-Length 字段</em></h4> <p>服务器在返回数据时，会有 <code>Content-Length</code> 字段，表明本次回应的<strong>数据长度</strong>。</p> <p>比如：</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>Content-Length: 1000
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p><img alt="image" data-src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/network/image.7hv9gt57flg0.webp" loading="lazy" class="lazy"></p> <p>如上面则是告诉浏览器，本次服务器回应的数据长度是 1000 个字节，后面的<strong>字节就属于下一个回应了</strong>。</p> <blockquote><p>PS：大家应该都知道 HTTP 是基于 TCP 传输协议进行通信的，而使用了 TCP 传输协议，就会存在一个“粘包”的问题，<strong>HTTP 协议通过设置回车符、换行符作为 HTTP header 的边界，通过 Content-Length 字段作为 HTTP body 的边界，这两个方式都是为了解决“粘包”的问题</strong>。</p> <p><em><strong>什么是 TCP 粘包问题？</strong></em></p></blockquote> <h4 id="_3、connection-字段"><a href="#_3、connection-字段" class="header-anchor">#</a> <em>3、Connection 字段</em></h4> <p><code>Connection</code> 字段最常用于客户端<strong>要求</strong>服务器使用「HTTP 长连接」机制，以便其他请求复用。</p> <p>HTTP 长连接的<strong>特点</strong>是：只要任意一端没有明确提出断开连接，则保持 TCP 连接状态。</p> <p>HTTP/1.1 版本的默认连接都是长连接，但为了兼容老版本的 HTTP，需要指定 <code>Connection</code> 首部字段的值为 <code>Keep-Alive</code>。</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>Connection: Keep-Alive
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>开启了 HTTP Keep-Alive 机制后，连接就不会中断，而是保持连接。当客户端发送另一个请求时，它会使用同一个连接，一直持续到客户端或服务器端提出断开连接。</p> <blockquote><p>PS：HTTP Keep-Alive 和 TCP Keepalive 是不一样的，具体可以看这篇文章：<a href="https://xiaolincoding.com/network/3_tcp/tcp_http_keepalive.html" target="_blank" rel="noopener noreferrer">TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗？<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></p></blockquote> <h4 id="_4、content-type-字段"><a href="#_4、content-type-字段" class="header-anchor">#</a> <em>4、Content-Type 字段</em></h4> <p><code>Content-Type</code> 字段用于服务器回应时，告诉客户端，本次数据是什么格式。（即代表<strong>数据格式</strong>）</p> <p>比如：</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>// 下面类型表明，发送的是网页，而且编码是 UTF-8。

Content-Type: text/html; Charset=utf-8
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>客户端请求的时候，可以使用 <code>Accept</code> 字段声明自己可以接受哪些数据格式。</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>// 客户端声明自己可以接受任何格式的数据。

Accept: */*
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>具体如图所示：</p> <p><img alt="image" data-src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/network/image.228bv9gps7mo.webp" loading="lazy" class="lazy"></p> <h4 id="_5、content-encoding-字段"><a href="#_5、content-encoding-字段" class="header-anchor">#</a> <em>5、Content-Encoding 字段</em></h4> <p><code>Content-Encoding</code> 字段指的是<strong>数据的压缩方法</strong>。表示服务器返回的数据使用了什么压缩格式</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>// 服务器返回的数据采用了 gzip 方式压缩，告知客户端需要用此方式解压

Content-Encoding: gzip
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>客户端在请求时，用 <code>Accept-Encoding</code> 字段说明自己可以接受哪些压缩方法。</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>// 客户端能接受 gzip 和 deflate 的压缩数据

Accept-Encoding: gzip, deflate
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>具体如图所示：</p> <p><img alt="image" data-src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/network/image.3f6u2m8uwj60.webp" loading="lazy" class="lazy"></p> <h4 id="其他字段"><a href="#其他字段" class="header-anchor">#</a> 其他字段</h4> <p><img alt="1686320824926" data-src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/network/1686320824926.4z12r3gpjnw0.webp" loading="lazy" class="lazy"></p> <h3 id="http-和-https-有什么区别-重要-4"><a href="#http-和-https-有什么区别-重要-4" class="header-anchor">#</a> HTTP 和 HTTPS 有什么区别？（重要）4</h3> <p>主要有四个区别：</p> <ol><li><strong>端口号</strong>：HTTP 默认是 80，HTTPS 默认是 443。</li> <li><strong>URL 前缀</strong>：HTTP 的 URL 前缀是 <code>http://</code>，HTTPS 的 URL 前缀是 <code>https://</code>。</li> <li><strong>安全性和资源消耗</strong>：HTTP 协议运行在 TCP 之上，所有传输的内容都是明文，客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议，SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密，加密采用对称加密，但对称加密的密钥用服务器方的证书进行了非对称加密。所以说，<strong>HTTP 安全性没有 HTTPS 高，但是 HTTPS 比 HTTP 耗费更多服务器资源。</strong></li> <li><strong>SEO（搜索引擎优化）</strong>：搜索引擎通常会更青睐使用 HTTPS 协议的网站，因为 HTTPS 能够提供更高的安全性和用户隐私保护。<strong>使用 HTTPS 协议的网站在搜索结果中可能会被优先显示</strong>，从而对 SEO 产生影响。</li></ol> <h3 id="http-1-0-和-http-1-1-有什么区别-5"><a href="#http-1-0-和-http-1-1-有什么区别-5" class="header-anchor">#</a> HTTP/1.0 和 HTTP/1.1 有什么区别？5</h3> <p>主要有五类区别：</p> <ol><li><p><strong>连接方式</strong>:</p> <ul><li>HTTP/1.0 为短连接；</li> <li>HTTP/1.1 支持长连接。</li></ul></li> <li><p><strong>状态响应码</strong>: HTTP/1.1 中新加入了大量的状态码，光是错误响应状态码就新增了 24 种。</p> <blockquote><p>比如说：</p> <ul><li><code>100 (Continue)</code>——在请求大资源前的预热请求；</li> <li><code>206 (Partial Content)</code>——范围请求的标识码；</li> <li><code>409 (Conflict)</code>——请求与当前资源的规定冲突；</li> <li><code>410 (Gone)</code>——资源已被永久转移，而且没有任何已知的转发地址。</li></ul></blockquote></li> <li><p><strong>缓存机制</strong>:</p> <ul><li><p>在 HTTP/1.0 中主要使用 Header 里的 If-Modified-Since,Expires 来做为缓存判断的标准；</p></li> <li><p>HTTP/1.1 则引入了更多的缓存控制策略，例如 Entity tag，If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。</p></li></ul></li> <li><p><strong>带宽</strong>：</p> <ul><li>HTTP/1.0 中，存在一些浪费带宽的现象，例如客户端只是需要某个对象的一部分，而服务器却将整个对象送过来了，并且不支持断点续传功能</li> <li>HTTP/1.1 则在请求头引入了 range 头域，它允许只请求资源的某个部分，即返回码是 <code>206（Partial Content）</code>，这样就方便了开发者自由的选择以便于充分利用带宽和连接。</li></ul></li> <li><p><strong>Host 头（Host Header）处理</strong>:</p> <ul><li>HTTP/1.1 引入了 Host 头字段，允许在同一 IP 地址上托管多个域名，从而支持虚拟主机的功能；</li> <li>而 HTTP/1.0 没有 Host 头字段，无法实现虚拟主机。</li></ul></li></ol> <h3 id="http-1-1-和-http-2-0-有什么区别-4"><a href="#http-1-1-和-http-2-0-有什么区别-4" class="header-anchor">#</a> HTTP/1.1 和 HTTP/2.0 有什么区别？4</h3> <p>主要有四个区别：</p> <ol><li><p><strong>IO 多路复用（Multiplexing）</strong>：</p> <ul><li>HTTP/1.1 使用串行方式，每个请求和响应都需要独立的连接。</li> <li>而 HTTP/2.0 在同一连接上可以同时传输多个请求和响应（可以看作是 HTTP/1.1 中长链接的升级版本）。这使得 HTTP/2.0 在处理多个请求时更加高效，减少了网络延迟和提高了性能。</li></ul></li> <li><p><strong>二进制帧（Binary Frames）</strong>：</p> <ul><li>HTTP/1.1 则使用文本格式的报文。</li> <li>而 HTTP/2.0 使用二进制帧进行数据传输。二进制帧更加紧凑和高效，减少了传输的数据量和带宽消耗。</li></ul></li> <li><p><strong>头部压缩（Header Compression）</strong>：</p> <ul><li><p>HTTP/1.1 支持 <code>Body</code> 压缩，不支持 <code>Header</code> 压缩。</p></li> <li><p>HTTP/2.0 支持对 <code>Header</code> 压缩，减少了网络开销。</p></li></ul></li> <li><p><strong>服务器推送（Server Push）</strong>：</p> <ul><li>HTTP/2.0 支持服务器推送，可以在客户端请求一个资源时，将其他相关资源一并推送给客户端，从而减少了客户端的请求次数和延迟。</li> <li>而 HTTP/1.1 需要客户端自己发送请求来获取相关资源。</li></ul></li></ol> <h3 id="http-2-0-和-http-3-0-有什么区别-5"><a href="#http-2-0-和-http-3-0-有什么区别-5" class="header-anchor">#</a> HTTP/2.0 和 HTTP/3.0 有什么区别？5</h3> <ol><li><p><strong>传输协议</strong>：</p> <ul><li><p>HTTP/2.0 是<strong>基于 TCP 协议实现</strong>的。</p></li> <li><p>HTTP/3.0 <strong>新增了 QUIC</strong>（Quick UDP Internet Connections）协议来实现可靠的传输，提供与 TLS/SSL 相当的安全性，具有较低的连接和传输延迟。</p> <blockquote><p>你可以将 QUIC 看作是 UDP 的升级版本，在其基础上新增了很多功能比如加密、重传等等。HTTP/3.0 之前名为 HTTP-over-QUIC，从这个名字中我们也可以发现，HTTP/3 最大的改造就是使用了 QUIC。</p></blockquote></li></ul></li> <li><p><strong>连接建立</strong>：</p> <ul><li>HTTP/2.0 <strong>需要经过经典的 TCP 三次握手过程</strong>（一般是 3 个 RTT）。</li> <li>而 HTTP/3.0 由于 QUIC 协议的特性，<strong>可以避免 TCP 三次握手的延迟</strong>，允许在第一次连接时发送数据（0 个 RTT，零往返时间）。</li></ul></li> <li><p><strong>队头阻塞</strong>：</p> <ul><li>HTTP/2.0 多请求复用一个 TCP 连接，<strong>一旦发生丢包，就会阻塞住所有的 HTTP 请求</strong>。</li> <li>而 HTTP/3.0 在一定程度上解决了队头阻塞（Head-of-Line blocking, 简写：HOL blocking）问题，一个连接建立多个不同的数据流，这些数据流之间独立互不影响，<strong>某个数据流发生丢包了，其数据流不受影响</strong>（本质上是多路复用+轮询）。</li></ul></li> <li><p><strong>错误恢复</strong>：</p> <ul><li><p>HTTP/2.0 <strong>需要依赖于 TCP 的错误恢复机制</strong>。</p></li> <li><p>而 HTTP/3.0 <strong>具有更好的错误恢复机制</strong>，当出现丢包、延迟等网络问题时，可以更快地进行恢复和重传。</p></li></ul></li> <li><p><strong>安全性</strong>：</p> <p>HTTP/2.0 和 HTTP/3.0 在安全性上都有较高的要求，支持加密通信，但在实现上有所不同。</p> <ul><li>HTTP/2.0 使用 TLS 协议进行加密。</li> <li>而 HTTP/3.0 基于 QUIC 协议，包含了内置的加密和身份验证机制，可以提供更强的安全性。</li></ul></li></ol> <h3 id="总结"><a href="#总结" class="header-anchor">#</a> 总结</h3> <p><img alt="http-协议" data-src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/network/http-%E5%8D%8F%E8%AE%AE.fx2rzvhgmk0.webp" loading="lazy" class="lazy"></p> <h3 id="http-是不保存状态的协议-如何保存用户状态"><a href="#http-是不保存状态的协议-如何保存用户状态" class="header-anchor">#</a> HTTP 是不保存状态的协议, 如何保存用户状态？</h3> <p>HTTP 是一种不保存状态，即无状态（stateless）协议。也就是说 <strong>HTTP 协议自身不对请求和响应之间的通信状态进行保存</strong>。那么我们保存用户状态呢？</p> <p><strong>使用 Session 机制。</strong></p> <p>Session 机制的存在就是为了解决这个问题，Session 的主要作用就是：通过服务端记录用户的状态。</p> <ul><li><p><strong>典型的场景</strong>是购物车，当你要添加商品到购物车的时候，系统不知道是哪个用户操作的，因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了（一般情况下，服务器会在一定时间内保存这个 Session，过了时间限制，就会销毁这个 Session）。</p></li> <li><p>在服务端<strong>保存 Session 的方法</strong>很多，最常用的就是内存和数据库(比如是使用内存数据库 redis 保存)。</p></li></ul> <p><em><strong>1、既然 Session 存放在服务器端，那么我们如何实现 Session 跟踪呢？</strong></em></p> <p>大部分情况下，都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪。</p> <p><em><strong>2、Cookie 被禁用怎么办?</strong></em></p> <p>最常用的就是利用 URL 重写把 Session ID 直接附加在 URL 路径的后面。</p> <h3 id="uri-和-url-的区别是什么"><a href="#uri-和-url-的区别是什么" class="header-anchor">#</a> URI 和 URL 的区别是什么?</h3> <ul><li><p>URI(Uniform Resource Identifier)：是统一资源<strong>标志符</strong>，可以<strong>唯一标识一个资源</strong>。</p> <p>URI 示例，<strong>比如一个电子邮件地址</strong>：</p> <div class="language-URI line-numbers-mode"><pre class="language-uri"><code><span class="token scheme">mailto<span class="token scheme-delimiter">:</span></span><span class="token path">example@example.com</span>

<span class="token authority"><span class="token authority-delimiter">//</span></span> mailto: 是 URI 方案，后跟实际的电子邮件地址。
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div></li> <li><p>URL(Uniform Resource Locator)：是统一资源<strong>定位符</strong>，可以<strong>提供该资源的路径</strong>（用于标识资源的地址）。它是一种具体的 URI，即 URL 可以用来标识一个资源，而且还指明了如何 locate 这个资源。</p> <p>URL 示例，<strong>比如网页的地址</strong>：</p> <div class="language-URL line-numbers-mode"><pre class="language-url"><code><span class="token scheme">https<span class="token scheme-delimiter">:</span></span><span class="token authority"><span class="token authority-delimiter">//</span><span class="token host">www.example.com</span></span><span class="token path"><span class="token path-separator">/</span>index.html</span>

<span class="token scheme">https<span class="token scheme-delimiter">:</span></span><span class="token authority"><span class="token authority-delimiter">//</span></span> 是 URL 的协议部分
<span class="token path">www.example.com</span> 是主机名
<span class="token path">index.html</span> 是在服务器上的文件路径
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div></li></ul> <p>URI 的作用像身份证号一样，URL 的作用更像家庭住址一样。URL 是一种具体的 URI，它不仅可以唯一标识资源，而且还提供了定位该资源的信息。</p> <h3 id="cookie-和-session-有什么区别"><a href="#cookie-和-session-有什么区别" class="header-anchor">#</a> Cookie 和 Session 有什么区别？</h3> <p>Cookie 和 Session 都是在 Web 开发中<strong>用于管理用户状态的技术</strong>，它们的主要区别有 5 个：</p> <ol><li><p><strong>存储位置：</strong></p> <p>Cookie 保存在<strong>客户端</strong>，而 Session 保存在<strong>服务器端</strong>。</p></li> <li><p><strong>安全性：</strong></p> <p>由于 Cookie 保存在客户端，所以 <strong>Cookie 存在被恶意篡改的风险</strong>；而 Session 保存在服务器端，<strong>相对来说更加安全</strong>。</p></li> <li><p><strong>存储内容：</strong></p> <p>Cookie 保存的信息是<strong>明文</strong>的，而 Session 保存的信息是<strong>加密</strong>的。</p></li> <li><p><strong>生命周期：</strong></p> <p>Cookie <strong>可以设置过期时间</strong>，而 Session <strong>默认情况下在用户关闭浏览器后就会过期</strong>。</p></li> <li><p><strong>存储容量</strong>：</p> <p>Cookie 存储的数据量<strong>有限制</strong>，一般为 4KB 左右；而 Session 存储的数据量<strong>没有限制</strong>，但是过多的 Session 会占用服务器的内存。</p></li></ol> <h3 id="get-与-post"><a href="#get-与-post" class="header-anchor">#</a> GET 与 POST</h3> <h4 id="get-和-post-有什么区别"><a href="#get-和-post-有什么区别" class="header-anchor">#</a> GET 和 POST 有什么区别？</h4> <p><strong>GET 的语义是从服务器获取指定的资源</strong>，这个资源可以是静态的文本、页面、图片视频等。（用 URL 传输数据）</p> <p>GET 请求的参数位置一般是写在 URL 中，URL 规定只能支持 ASCII，所以 GET 请求的参数只允许 ASCII 字符 ，而且浏览器会对 URL 的<strong>长度有限制</strong>。（用 body 传输数据）</p> <blockquote><p>HTTP协议本身对 URL 长度并没有做任何规定。</p></blockquote> <p><strong>POST 的语义是根据请求负荷（报文body）对指定的资源做出处理</strong>，具体的处理方式视资源类型而不同。</p> <p>POST 请求携带数据的位置一般是写在报文 body 中，body 中的数据可以是任意格式的数据，只要客户端与服务端协商好即可，而且浏览器不会对 body 大小做限制。</p> <h4 id="get-和-post-方法都是安全和幂等的吗"><a href="#get-和-post-方法都是安全和幂等的吗" class="header-anchor">#</a> GET 和 POST 方法都是安全和幂等的吗？</h4> <blockquote><p>安全和幂等的概念：</p> <ul><li>在 HTTP 协议里，所谓的「安全」是指<strong>请求方法不会「破坏」服务器上的资源。</strong></li> <li>所谓的「幂等」，意思是<strong>多次执行相同的操作，结果都是「相同」的。</strong></li></ul></blockquote> <p><em>1、从 RFC 规范定义的语义来看：</em></p> <ul><li><strong>GET 方法就是安全且幂等的</strong>，因为它是「只读」操作，无论操作多少次，服务器上的数据都是安全的，且每次的结果都是相同的。所以，<strong>可以对 GET 请求的数据做缓存，这个缓存可以做到浏览器本身上（彻底避免浏览器发请求），也可以做到代理上（如nginx），而且在浏览器中 GET 请求可以保存为书签</strong>。</li> <li><strong>POST</strong> 因为是「新增或提交数据」的操作，会修改服务器上的资源，所以是<strong>不安全</strong>的，且多次提交数据就会创建多个资源，所以<strong>不是幂等</strong>的。所以，<strong>浏览器一般不会缓存 POST 请求，也不能把 POST 请求保存为书签</strong>。</li></ul> <p>简单总结一下：</p> <ul><li>GET 的语义是请求获取指定的资源。GET 方法是<strong>安全、幂等、可被缓存</strong>的。</li> <li>POST 的语义是根据请求负荷（报文主体）对指定的资源做出处理，具体的处理方式视资源类型而不同。POST <strong>不安全，不幂等，（大部分实现）不可缓存</strong>。</li></ul> <p><em>2、从实际过程来看</em></p> <p>在实际过程中，开发者不一定会按照 RFC 规范定义的语义来实现 GET 和 POST 方法。比如：</p> <ul><li>可以用 GET 方法实现新增或删除数据的请求，这样实现的 GET 方法自然就不是安全和幂等。</li> <li>可以用 POST 方法实现查询数据的请求，这样实现的 POST 方法自然就是安全和幂等。</li></ul> <h4 id="get-一定比-post-安全吗"><a href="#get-一定比-post-安全吗" class="header-anchor">#</a> GET 一定比 POST 安全吗？</h4> <p>如果单从<strong>信息是否会被泄漏</strong>来判定安全性的话，并不能说 GET 不如 POST 安全。</p> <blockquote><p>虽然 POST 用 body 传输数据，</p> <p>而 GET 用 URL 传输，这样数据会在浏览器地址拦容易看到</p></blockquote> <p>因为 HTTP 传输的内容都是明文的，虽然在浏览器地址拦看不到 POST 提交的 body 数据，但是<strong>只要抓个包就都能看到了</strong>。</p> <blockquote><p>所以，要避免传输过程中数据被窃取，就要使用 HTTPS 协议，这样所有 HTTP 的数据都会被加密传输。</p></blockquote> <h4 id="get-请求可以带-body-吗"><a href="#get-请求可以带-body-吗" class="header-anchor">#</a> GET 请求可以带 body 吗？</h4> <p>可以带。</p> <ul><li>RFC 规范并没有规定 GET 请求不能带 body。</li> <li>理论上，任何请求都是可以带 body 的。只是因为 RFC 规范定义的 GET 请求是获取资源，所以根据这个<strong>语义不需要用到 body</strong>。</li></ul> <blockquote><p>另外，URL 中的查询参数也不是 GET 所独有的，POST 请求的 URL 中也可以有参数的。</p></blockquote> <p>POST 请求中的参数通常包含在请求的消息体中，而不是像 GET 请求一样包含在 URL 中。以下是一个登录功能的例子：</p> <div class="language-text line-numbers-mode"><pre class="language-text"><code>POST /api/login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
username=johndoe&amp;amp;password=secret
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>在这个例子中，我们向 <code>example.com</code> 发送了一个 POST 请求，请求的路径为 <code>/api/login</code>，请求头中包含了 <code>Content-Type</code> 字段，表示请求消息体的格式为 <code>application/x-www-form-urlencoded</code>，请求消息体中包含了两个参数 <code>username</code> 和 <code>password</code>。</p> <p>在实际开发中，我们可以通过发送 POST 请求并在请求消息体中包含参数，来向服务器提交数据。</p> <h4 id="什么是-rfc-协议"><a href="#什么是-rfc-协议" class="header-anchor">#</a> 什么是 RFC 协议？</h4> <p>RFC（Request for Comments）<strong>是一系列文件的集合</strong>，这些文件包含了关于互联网技术、协议、体系结构和操作的<strong>信息和思想</strong>。</p> <p>RFC 文件由互联网工程任务组（IETF）进行维护和发布。IETF 是一个开放的、国际性的组织，旨在推动互联网的技术和标准的发展。</p> <p>RFC 文件通常描述了互联网标准、协议、流程、算法、编码规范和其他相关主题。RFC 文件的<strong>主要目的是促进开放、自由和协作式的标准制定过程，以便所有人都可以参与互联网标准的制定和实施</strong>。</p> <p>RFC 文件不仅仅是一堆文本文件，它们还<strong>会被设计成软件规范和协议</strong>，以便开发人员可以根据这些规范开发互联网应用程序。 RFC 文件是互联网技术发展史上非常重要的一部分，每个 RFC 文件都有一个唯一的编号和标题，例如 RFC 2616，也称为 HTTP/1.1。这个 RFC 文件定义了 HTTP 协议的版本 1.1，包括 HTTP 请求和响应的格式、语法和语义。其他一些著名的 RFC 文件包括 RFC 793（TCP 协议）、RFC 821（SMTP 协议）和RFC 2822（电子邮件格式）。</p> <h2 id="tcp-与-udp-传输层"><a href="#tcp-与-udp-传输层" class="header-anchor">#</a> TCP 与 UDP（传输层）</h2> <h3 id="tcp-与-udp-的区别-重要"><a href="#tcp-与-udp-的区别-重要" class="header-anchor">#</a> TCP 与 UDP 的区别（重要）</h3> <p>总结来说：</p> <p>UDP 在传送数据之前不需要先建立连接，是无状态的，传输不可靠但效率较高，支持一对多通信；</p> <p>TCP 在传送数据之前必须先建立连接，是有状态的，提供可靠传输服务，只支持点对点通信。</p> <ol><li><p><strong>是否面向连接</strong>：</p> <ul><li>TCP 在传送数据之前必须先建立连接。</li> <li>而 UDP 在传送数据之前不需要先建立连接。</li></ul></li> <li><p><strong>是否是可靠传输</strong>：</p> <ul><li>TCP 在传递数据之前，会有三次握手来建立连接，通过 TCP 连接传输的数据，无差错、不丢失、不重复、并且按序到达。</li> <li>而远地主机在收到 UDP 报文后，不需要给出任何确认，并且不保证数据不丢失，不保证是否顺序到达。</li></ul></li> <li><p><strong>是否有状态</strong>：</p> <ul><li>TCP 传输是有状态的，这个有状态说的是 TCP 会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。</li> <li>而 UDP 是无状态服务，简单来说就是不管发出去之后的事情了。</li></ul></li> <li><p><strong>传输效率</strong>：</p> <p>由于使用 TCP 进行传输的时候多了连接、确认、重传等机制，所以 <strong>TCP 的传输效率要比 UDP 低很多</strong>。</p></li> <li><p><strong>传输形式</strong>：</p> <ul><li>TCP 是面向字节流的，</li> <li>UDP 是面向报文的。</li></ul></li> <li><p><strong>首部开销</strong>：</p> <p>TCP 首部开销比 UDP 首部开销要大。</p></li> <li><p><strong>是否提供广播或多播服务</strong>：</p> <ul><li>TCP 只支持点对点通信，</li> <li>而 UDP 支持一对一、一对多、多对一、多对多。</li></ul></li></ol> <h3 id="什么时候选择-tcp-什么时候选-udp"><a href="#什么时候选择-tcp-什么时候选-udp" class="header-anchor">#</a> 什么时候选择 TCP，什么时候选 UDP?</h3> <ul><li><strong>UDP 一般用于即时通信</strong>，比如：语音、 视频、直播等等。这些场景对传输数据的准确性要求不是特别高，比如你<strong>看视频</strong>即使少个一两帧，实际给人的感觉区别也不大。</li> <li><strong>TCP 用于对传输准确性要求特别高的场景</strong>，比如<strong>文件传输</strong>、发送和接收邮件、远程登录等等。</li></ul> <h3 id="http-基于-tcp-还是-udp"><a href="#http-基于-tcp-还是-udp" class="header-anchor">#</a> HTTP 基于 TCP 还是 UDP？</h3> <ul><li>HTTP/3.0 之前是基于 TCP 协议的，</li> <li>而 HTTP/3.0 改用 <strong>基于 UDP 的 QUIC 协议</strong> 。</li></ul> <h3 id="使用-tcp-的协议有哪些"><a href="#使用-tcp-的协议有哪些" class="header-anchor">#</a> 使用 TCP 的协议有哪些?</h3> <p>常见的有：</p> <ol><li>HTTP（HyperText Transfer Protocol，<strong>超文本传输协议</strong>）</li> <li>FTP（File Transfer Protocol，<strong>文件传输协议</strong>）</li> <li>SMTP（Simple Mail Transfer Protocol，<strong>简单邮件传输协议</strong>）</li> <li>Telnet（<strong>远程登录协议</strong>）</li> <li>SSH（Secure Shell，<strong>安全外壳协议</strong>）</li></ol> <h3 id="使用-udp-的协议有哪些"><a href="#使用-udp-的协议有哪些" class="header-anchor">#</a> 使用 UDP 的协议有哪些?</h3> <p>常见的有</p> <ol><li><strong>DNS</strong>（Domain Name System，域名系统）</li> <li>DHCP（Dynamic Host Configuration Protocol，<strong>动态主机配置协议</strong>）</li> <li>TFTP（Trivial File Transfer Protocol，<strong>简单文件传输协议</strong>）</li> <li>SNMP（Simple Network Management Protocol，<strong>简单网络管理协议</strong>）</li></ol> <h2 id="ip-网络层"><a href="#ip-网络层" class="header-anchor">#</a> IP（网络层）</h2> <h3 id="ip-协议的作用是什么"><a href="#ip-协议的作用是什么" class="header-anchor">#</a> IP 协议的作⽤是什么？</h3> <p><strong>IP（Internet Protocol，网际协议）</strong> 是 TCP/IP 协议中最重要的协议之一，属于网络层的协议。</p> <p>主要作用是定义数据包的格式、对数据包进行路由和寻址，以便它们可以跨网络传播并到达正确的目的地。</p> <h3 id="什么是-ip-地址"><a href="#什么是-ip-地址" class="header-anchor">#</a> 什么是 IP 地址？</h3> <p>IP 地址是 Internet Protocol Address（网际协议地址）的缩写，<strong>是互联网中用于识别设备的数字标识</strong>。</p> <p>在 TCP/IP 协议中，IP 地址用于标识网络中的主机或设备。它是一个 32 位二进制数，通常用“点分十进制”表示法表示，即四个用点分隔的十进制数，每个数的取值范围为 0-255。</p> <p>IP 地址分为公网 IP 地址和私有 IP 地址两种类型。</p> <ul><li>公网 IP 地址是唯一的，由 ISP（Internet Service Provider，互联网服务提供商）分配，用于在 Internet 上识别设备；</li> <li>私有 IP 地址不唯一，用于在局域网内标识设备。常见的私有 IP 地址有 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16 等。</li></ul> <h3 id="ip-寻址如何工作"><a href="#ip-寻址如何工作" class="header-anchor">#</a> IP 寻址如何⼯作？</h3> <p>IP 寻址是指：确定数据包在网络中的传输路径，使其能够正确地到达目标设备。</p> <p>IP 寻址的过程主要分为四个步骤：</p> <ol><li><strong>分配 IP 地址</strong>：每个设备在接入网络时，需要被分配一个唯一的IP 地址。
<ul><li>公网 IP 地址由 ISP（Internet Service Provider，互联网服务提供商）分配，</li> <li>而私有 IP 地址通常由网络管理员进行分配。</li></ul></li> <li><strong>确定子网掩码</strong>：子网掩码用于将一个 IP 地址分成网络部分和主机部分。<strong>在同一网络中的设备必须使用相同的子网掩码</strong>。</li> <li><strong>确定默认网关</strong>：默认网关（也称为默认路由）是一个设备的出口地址，<strong>用于将数据包发送到其他网络</strong>。默认网关通常是网络中的路由器。</li> <li><strong>确定 DNS 服务器</strong>：DNS 服务器用于将域名解析为 IP 地址。当设备需要访问 Internet 上的其他设备时，需要<strong>向 DNS 服务器查询目标设备的 IP 地址</strong>。</li> <li><strong>进行 IP 寻址</strong>：当设备需要向其他设备发送数据包时，它首先需要确定目标设备的 IP 地址。设备会比较自己的 IP 地址和目标设备的 IP 地址，<strong>确定它们是否在同一网段中</strong>。
<ul><li>如果目标设备与自己在同一网段中，则设备会直接发送数据包到目标设备；</li> <li>如果目标设备与自己不在同一网段中，则设备会将数据包发送到默认网关，由默认网关将数据包转发到目标设备所在的网络中。</li></ul></li></ol> <h3 id="ipv4-和-ipv6-有什么区别"><a href="#ipv4-和-ipv6-有什么区别" class="header-anchor">#</a> IPv4 和 IPv6 有什么区别？</h3> <p>IPv4 和 IPv6 之间的主要区别在于<strong>地址空间大小</strong>和<strong>地址表示方式</strong>。</p> <ol><li><p>地址空间大小：</p> <ul><li>IPv4 使用 <strong>32 位地址</strong>，可以表示约 42 亿（2^32）个可用 IP 地址。随着互联网的快速发展，IPv4 地址已经不足以满足需求。</li> <li>IPv6 使用 <strong>128 位地址</strong>，可以表示约 340 万亿亿亿亿（2^128）个地址，将满足未来的地址需求。</li></ul></li> <li><p>地址表示方式：</p> <ul><li>IPv4 地址使用<strong>点分十进制表示法</strong>，例如 192.168.1.1；</li> <li>IPv6 地址使用<strong>冒号分组表示法</strong>，例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。为了缩短 IPv6 地址的长度，IPv6 地址中连续的 0 可以省略，例如 2001:0db8:85a3**:😗*8a2e:0370:7334。</li></ul></li></ol> <p>除了地址空间大小和地址表示方式之外，IPv6还具有一些其他的优势，例如<strong>更好的安全性、更高的性能和更智能的路由选择</strong>。</p> <h2 id="ping"><a href="#ping" class="header-anchor">#</a> PING</h2> <h3 id="ping-命令的作用是什么"><a href="#ping-命令的作用是什么" class="header-anchor">#</a> ping 命令的作用是什么？</h3> <p>ping 命令是一种常用的<strong>网络诊断工具</strong>，经常<strong>用来测试网络中主机之间的连通性和网络延迟</strong>。</p> <ul><li>如果 PING 对应的目标主机无法得到正确的响应，则表明这两个主机之间的连通性存在问题。</li> <li>如果往返时间（RTT）过高，则表明网络延迟过高。</li></ul> <h3 id="ping-命令的工作原理是什么"><a href="#ping-命令的工作原理是什么" class="header-anchor">#</a> PING 命令的工作原理是什么？</h3> <p>ping 是基于 <code>ICMP</code> 协议工作的，其主要原理就是通过在网络上发送和接收 ICMP 报文实现的。</p> <p>具体来说：</p> <ul><li>首先 PING 命令会向目标主机发送一个 ICMP Echo Request（请求报文）。</li> <li>如果两个主机的连通性正常，目标主机会返回一个对应的 ICMP Echo Reply（响应报文），PING 命令会接收并分析该数据包，并计算出往返时间（RTT）和丢包率等信息。</li></ul> <blockquote><p>PING 用到的 ICMP Echo Request（类型为 8 ） 和 ICMP Echo Reply（类型为 0） 属于查询报文类型。、</p> <ul><li>8 - 代表回送请求</li> <li>0 - 代表回送应答</li></ul> <p>PING 命令利用 ICMP 协议的 ECHO REQUEST 和 ECHO REPLY 消息来测试<strong>目标主机的可达性</strong>和<strong>网络质量</strong>。</p></blockquote> <h3 id="什么是-icmp-协议"><a href="#什么是-icmp-协议" class="header-anchor">#</a> 什么是 ICMP 协议？</h3> <p>ICMP 全称是 <strong>Internet Control Message Protocol</strong>，也就是<strong>互联网控制报文协议</strong>。</p> <p>ICMP 报文是封装在 IP 包里面，它工作在网络层，是 IP 协议的助手。</p> <p>ICMP 包头的<strong>类型</strong>字段，大致可以分为两大类：</p> <ul><li>一类是用于诊断的查询消息，也就是「<strong>查询报文类型</strong>」</li> <li>另一类是通知出错原因的错误消息，也就是「<strong>差错报文类型</strong>」</li></ul> <p><img alt="image" data-src="https://cdn.jsdelivr.net/gh/cmty256/imgs-blog@main/network/image.supojqic5f4.webp" loading="lazy" class="lazy"></p> <h3 id="ping-命令的输出结果什么样子的"><a href="#ping-命令的输出结果什么样子的" class="header-anchor">#</a> ping 命令的输出结果什么样子的？</h3> <p>PING 命令的输出结果通常包括以下几部分信息：</p> <ol><li><strong>ICMP Echo Request（请求报文）信息</strong>：序列号、TTL（Time to Live）值。</li> <li><strong>目标主机的域名或 IP 地址</strong>：输出结果的第一行。</li> <li><strong>往返时间（RTT，Round-Trip Time）</strong>：从发送 ICMP Echo Request（请求报文）到接收到 ICMP Echo Reply（响应报文）的总时间，用来衡量网络连接的延迟。</li> <li><strong>统计结果（Statistics）</strong>：包括发送的 ICMP 请求数据包数量、接收到的 ICMP 响应数据包数量、丢包率、往返时间（RTT）的最小、平均、最大和标准偏差值。</li></ol> <p>下面是一个 ping 百度的例子：</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token comment"># 发送4个PING请求数据包到 www.baidu.com</span>
❯ <span class="token function">ping</span> <span class="token parameter variable">-c</span> <span class="token number">4</span> www.baidu.com

PING www.a.shifen.com <span class="token punctuation">(</span><span class="token number">14.119</span>.104.189<span class="token punctuation">)</span>: <span class="token number">56</span> data bytes
<span class="token number">64</span> bytes from <span class="token number">14.119</span>.104.189: <span class="token assign-left variable">icmp_seq</span><span class="token operator">=</span><span class="token number">0</span> <span class="token assign-left variable">ttl</span><span class="token operator">=</span><span class="token number">54</span> <span class="token assign-left variable">time</span><span class="token operator">=</span><span class="token number">27.867</span> ms
<span class="token number">64</span> bytes from <span class="token number">14.119</span>.104.189: <span class="token assign-left variable">icmp_seq</span><span class="token operator">=</span><span class="token number">1</span> <span class="token assign-left variable">ttl</span><span class="token operator">=</span><span class="token number">54</span> <span class="token assign-left variable">time</span><span class="token operator">=</span><span class="token number">28.732</span> ms
<span class="token number">64</span> bytes from <span class="token number">14.119</span>.104.189: <span class="token assign-left variable">icmp_seq</span><span class="token operator">=</span><span class="token number">2</span> <span class="token assign-left variable">ttl</span><span class="token operator">=</span><span class="token number">54</span> <span class="token assign-left variable">time</span><span class="token operator">=</span><span class="token number">27.571</span> ms
<span class="token number">64</span> bytes from <span class="token number">14.119</span>.104.189: <span class="token assign-left variable">icmp_seq</span><span class="token operator">=</span><span class="token number">3</span> <span class="token assign-left variable">ttl</span><span class="token operator">=</span><span class="token number">54</span> <span class="token assign-left variable">time</span><span class="token operator">=</span><span class="token number">27.581</span> ms

<span class="token comment"># 输出的结果</span>
--- www.a.shifen.com <span class="token function">ping</span> statistics ---
<span class="token number">4</span> packets transmitted, <span class="token number">4</span> packets received, <span class="token number">0.0</span>% packet loss
round-trip min/avg/max/stddev <span class="token operator">=</span> <span class="token number">27.571</span>/27.938/28.732/0.474 ms
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><h2 id="dns"><a href="#dns" class="header-anchor">#</a> DNS</h2> <h3 id="什么是-dns"><a href="#什么是-dns" class="header-anchor">#</a> 什么是 DNS？</h3> <p>DNS（Domain Name System）域名管理系统，是当用户使用浏览器访问网址之后，使用的第一个<strong>重要协议</strong>。</p> <p>DNS 要解决的是<strong>域名和 IP 地址的映射问题</strong>。</p> <blockquote><p>目前 DNS 的设计采用的是分布式、层次数据库结构，<strong>DNS 是应用层协议，基于 UDP 协议之上，端口为 53</strong></p></blockquote> <h3 id="dns-的作用是什么"><a href="#dns-的作用是什么" class="header-anchor">#</a> DNS 的作用是什么？</h3> <p>DNS（Domain Name System）的作用是：<strong>将域名转换为 IP 地址，使得用户可以通过更易于记忆的域名来访问网站和其他网络服务</strong>。</p> <p>在互联网上，每个设备都需要一个唯一的 IP 地址来进行通信，而使用域名可以避免用户需要记住许多复杂的 IP 地址。DNS 将域名映射到对应的 IP 地址，使得用户在输入域名时可以自动向正确的 IP 地址发送请求，从而访问相应的网站或服务。</p> <h3 id="dns-服务器有哪些"><a href="#dns-服务器有哪些" class="header-anchor">#</a> DNS 服务器有哪些？</h3> <p>DNS 服务器<strong>自底向上</strong>可以依次分为以下 4 个层级：</p> <p>根 -&gt; 顶级 -&gt; 权威 -&gt; 本地</p> <p>所有 DNS 服务器都属于这四个类别之一。</p> <blockquote><ol><li><strong>根域名服务器</strong>。它是互联网上<strong>最高级别</strong>的 DNS 服务器，管理顶级域名服务器的地址，并提供 DNS 递归解析服务。目前世界上只有 13 组根服务器，我国境内目前仍没有根服务器。</li> <li><strong>顶级域名服务器（TLD 服务器）</strong>。顶级域是指域名的后缀，如 <code>com</code>、<code>org</code>、<code>net</code> 和 <code>edu</code> 等。国家也有自己的顶级域，如 <code>uk</code>、<code>fr</code> 和 <code>ca</code>。TLD 服务器提供了权威 DNS 服务器的 IP 地址。</li> <li><strong>权威域名服务器</strong>。它是管理特定域名下所有主机的 DNS 服务器，例如某个网站的域名服务器。权威域名服务器存储着该域名下所有主机的 IP 地址信息，它们只回答自己管理的域名和主机的 DNS 查询请求。</li> <li><strong>本地域名服务器</strong>。它是用户计算机或局域网中的 DNS 服务器，<strong>用于缓存 DNS 查询结果，并提供 DNS 递归解析服务</strong>。</li></ol> <ul><li>当用户计算机发起 DNS 查询请求时，本地域名服务器会优先检查自己的缓存中是否有该域名对应的 IP 地址信息。</li> <li>如果没有，则向根域名服务器发起 DNS 查询请求，按照自底向上的顺序逐级向下查询，直到找到权威域名服务器并获得 IP 地址信息，最后将结果返回给用户计算机。</li></ul></blockquote> <h3 id="dns-解析的过程是什么样的"><a href="#dns-解析的过程是什么样的" class="header-anchor">#</a> DNS 解析的过程是什么样的？</h3> <p>DNS 解析过程大致可以分为以下几步：</p> <ol><li>浏览器发起 URL 请求，时</li> <li>操作系统向本地 DNS 服务器查询，</li> <li>本地 DNS 服务器向根域名服务器、顶级域名服务器和权威域名服务器查询，</li> <li>最终返回 IP 地址。</li></ol> <h2 id="arp"><a href="#arp" class="header-anchor">#</a> ARP</h2> <h3 id="什么是-mac-地址"><a href="#什么是-mac-地址" class="header-anchor">#</a> 什么是 Mac 地址？</h3> <p>简单来说：</p> <p>Mac 地址常被称为物理地址，是用于识别网络设备的唯一标识符且固定不变。</p> <blockquote><p>MAC 地址，全称 Media Access Control Address，即媒体访问控制地址，也称为物理地址或硬件地址，是用于识别网络设备的唯一标识符。MAC 地址通常由 48 位二进制数组成，其中前 24 位表示厂商代码，后 24 位为该厂商设备的序列号。</p> <p><strong>MAC 地址是数据链路层（OSI模型第二层）的概念</strong>，用于在同一局域网内识别和寻址网络设备。</p> <p><strong>在局域网中，每个网络设备都有一个唯一的 MAC 地址</strong>。当一个网络设备需要发送数据时，它首先会在目标设备的 ARP 缓存中查找目标设备的 MAC 地址，如果没有找到，则向局域网广播 ARP 请求，请求目标设备的 MAC 地址。当目标设备收到 ARP 请求后，它会向发送设备回复一个 ARP 响应，包含自己的 MAC 地址。发送设备在收到 ARP 响应后，就可以使用目标设备的 MAC 地址来发送数据了。</p> <p><strong>MAC 地址是固定不变的</strong>，一般情况下不会被修改。在实际应用中，MAC 地址被广泛应用于网络设备的管理和安全控制，如网络设备的远程管理、访问控制列表等。</p></blockquote> <h3 id="arp-协议解决了什么问题"><a href="#arp-协议解决了什么问题" class="header-anchor">#</a> ARP 协议解决了什么问题？</h3> <p>ARP 协议，全称 <strong>地址解析协议（Address Resolution Protocol）</strong>，解决了 IP 地址转 MAC 地址的一些问题。</p> <p>因为一个 IP 数据报在物理上传输的过程中，总是需要知道下一跳（物理上的下一个目的地）该去往何处</p> <blockquote><ul><li><p>IP 地址属于逻辑地址，</p></li> <li><p>而 MAC 地址才是物理地址</p></li></ul></blockquote></div></div> <!----> <div class="page-edit"><!----> <!----> <div class="last-updated"><span class="prefix">上次更新:</span> <span class="time">2024/6/3 14:54:44</span></div></div> <div class="page-nav-wapper"><div class="page-nav-centre-wrap"><!----> <a href="/pages/0728af/" class="page-nav-centre page-nav-centre-next"><div class="tooltip">TCP 三次握手和四次挥手</div></a></div> <div class="page-nav"><p class="inner"><!----> <span class="next"><a href="/pages/0728af/">TCP 三次握手和四次挥手</a>→
      </span></p></div></div></div> <!----></main></div> <div class="footer"><!----> 
  Theme by
  <a href="https://github.com/xugaoyi/vuepress-theme-vdoing" target="_blank" title="本站主题">Vdoing</a> 
    | Copyright © 2023-2025
    <span>霜晨月</span></div> <div class="buttons"><div title="返回顶部" class="button blur go-to-top iconfont icon-fanhuidingbu" style="display:none;"></div> <div title="去评论" class="button blur go-to-comment iconfont icon-pinglun" style="display:none;"></div> <div title="主题模式" class="button blur theme-mode-but iconfont icon-zhuti"><ul class="select-box" style="display:none;"><li class="iconfont icon-zidong">
          跟随系统
        </li><li class="iconfont icon-rijianmoshi">
          浅色模式
        </li><li class="iconfont icon-yejianmoshi">
          深色模式
        </li><li class="iconfont icon-yuedu">
          阅读模式
        </li></ul></div></div> <!----> <!----> <!----></div><div class="global-ui"><canvas id="vuepress-canvas-cursor"></canvas></div></div>
    <script src="/assets/js/app.67adcfd9.js" defer></script><script src="/assets/js/4.9aaa1650.js" defer></script><script src="/assets/js/1.5474518c.js" defer></script><script src="/assets/js/3.593d14fc.js" defer></script><script src="/assets/js/73.6f8b8211.js" defer></script>
  </body>
</html>
